//Copyright (c) 2006-2007 Microsoft Corporation.  All rights reserved
using System;
using System.Globalization;
using System.Xml;

using InvocationFramework.Common;
using InvocationFramework.Common.Exceptions;
using InvocationFramework.Common.Instrumentation;
using InvocationFramework.Common.Interfaces;
using InvocationFramework.Common.Resources;

namespace InvocationFramework.Adapters.Pipeline.Mock
{
    /// <summary>
    /// Este adapter se utiliza en conjunto con el filto de ejecucion simuladas (<see cref="MockFilter"/>)
    /// </summary>
    /// <author>Rodolfo Finochietti 24/05/2006 15.31</author>
    public class MockAdapter : IServiceAdapter
    {
        #region IServiceAdapter Members

        /// <summary>
        /// Variable privada para el manejo de la propiedad
        /// </summary>
        private string _id;

        /// <summary>
        /// Identificador del adaptador
        /// </summary>
        public string Id
        {
            get
            {
                return _id;
            }
        }

        /// <summary>
        /// Variable privada para el manejo de la propiedad
        /// </summary>
        private bool _initialized;

        /// <summary>
        /// Indica si el adaptador esta inicializado o no
        /// </summary>
        public bool Initialized
        {
            get
            {
                return _initialized;
            }
        }

        /// <summary>
        /// Inicializa el adaptador
        /// </summary>
        /// <param name="id">Identificador del adaptador</param>
        /// <param name="configuration">Configuracion del adaptador</param>
        public void Init( string id, XmlNode configuration )
        {
            if ( !_initialized )
            {
                try
                {
                    //Controlo que los parametros no sean nulos
                    if ( String.IsNullOrEmpty( id ) )
                        throw new ArgumentNullException( "id", String.Format( CultureInfo.InvariantCulture, Texts.MockAdapterArgumentNull, "id" ) );

                    //Cargo las propiedades
                    _id = id;

                    //Marco el flag de inicializado
                    _initialized = true;
                }
                catch ( Exception ex )
                {
                    TraceHelper.Error( ex, Texts.MockAdapterInitError );
                    throw;
                }
            }
        }

        /// <summary>
        /// Permite saber si un servicio esta disponible para ser ejecutado mediante este adaptador
        /// </summary>
        /// <param name="serviceName">Nombre del servicio</param>
        /// <returns>True este adaptador puede ejecutar este servicio, False de lo contrario</returns>
        public bool IsServiceAvailable( string serviceName )
        {
            return true;
        }

        /// <summary>
        /// Verifica si existe una operacion en un servicio
        /// </summary>
        /// <param name="serviceName">Nombre del servicio</param>
        /// <param name="operationName">Nombre de la operacion</param>
        /// <returns>True si la operacion existe en el servicio, de lo contrario False</returns>
        public bool IsServiceOperationAvailable( string serviceName, string operationName )
        {
            return true;
        }

        /// <summary>
        /// Devuelve una lista con los nombres de los servicios mas utilizados
        /// </summary>
        /// <returns>Una lista con los nombres de los servicios mas utilizados</returns>
        public string[] GetMostRequestedServices( )
        {
            return null;
        }

        /// <summary>
        /// Ejecuta la operacion que se encuentra en un determinado servicio
        /// </summary>
        /// <param name="serviceName">Nombre del servicio</param>
        /// <param name="operationName">Nombre de la operacion a ejecutar</param>
        /// <param name="context">El contexto que se desea propagar junto con al ejecucion del servicios</param>
        /// <param name="parameters">Parametros de la operacion</param>
        /// <returns>Resultado de la ejecucion de la operacion</returns>
        public object Execute( string serviceName, string operationName, ContextDictionary context, params object[] parameters )
        {
            if ( !_initialized )
                throw new InvocationFrameworkException( Texts.MockAdapterNotInitialized );

            //Este adaptador no se puede utilizar para ejecutar servicios
            throw new InvocationFrameworkException( Texts.MockAdapterInvalidUse );
        }

        #endregion
    }
}